package cqrtplm.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.hustcad.plm.pdm.enumeration.service.TyplmEnumerationService;
import com.hustcad.plm.pdm.iba.service.TyplmAttributeValueService;
import com.hustcad.plm.pdm.type.service.TyplmTypeService;
import com.hustcad.plm.pdm.user.service.TyplmUserService;
import com.ty.basic.constant.TableTypeConstrant;
import com.ty.basic.entity.org.UserDO;
import com.ty.basic.vo.AttributeVO;
import com.ty.basic.vo.TyAttributeDefMapVO;
import cqrtplm.dto.PartNumberDTO;
import cqrtplm.mapper.RTPartMapper;
import cqrtplm.mapper.RTTypeClassMapper;
import cqrtplm.service.InquiryMaterialNumberService;
import cqrtplm.vo.DrawingCodePartVO;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class InquiryMaterialNumberServiceImpl implements InquiryMaterialNumberService {

    private static final Logger log = LoggerFactory.getLogger(InquiryMaterialNumberServiceImpl.class);
    @Resource
    private RTTypeClassMapper rtTypeClassMapper;
    @Resource
    private TyplmTypeService typlmTypeService;
    @Resource
    private RTPartMapper rtPartMapper;
    @Resource
    private TyplmUserService typlmUserService;
    @Resource
    private TyplmAttributeValueService typlmAttributeValueService;
    @Resource
    private TyplmEnumerationService typlmEnumerationService;

    @Override
    public List<DrawingCodePartVO> queryDrawingCodeList(String type) {

        List<String> ibaNames = queryIbaName(type);
        if(CollUtil.isEmpty(ibaNames)){
            return null;
        }

        int i = type.indexOf("|");
        type = type.substring(i+1);

        List<PartNumberDTO> partDOS = rtPartMapper.selectAllPart(type);
        if(CollUtil.isEmpty(partDOS)){
            return null;
        }
        List<BigInteger> partOidList = partDOS.stream().map(PartNumberDTO::getOid).collect(Collectors.toList());
        Map<String, List<AttributeVO>> attrValueByOidAndKeys = typlmAttributeValueService.getIbaAttrValueByOidAndKeys(
                partOidList,
                TableTypeConstrant.TY_PART_OTYPE,
                ibaNames);
        List<String> nameList = Arrays.asList("LifeCycleState");
        Map<String, String> LifeCycleStateMap = this.typlmEnumerationService.getEnabledEnumItemsMap(nameList).get("LifeCycleState");
        List<DrawingCodePartVO> drawingCodePartVOS = new ArrayList<>();
        for (PartNumberDTO partDO : partDOS) {
            DrawingCodePartVO vo = new DrawingCodePartVO();
            vo.setOid(String.valueOf(partDO.getOid()));
            vo.setOtype(partDO.getOtype());
            List<AttributeVO> attributeVOS = attrValueByOidAndKeys.get(String.valueOf(partDO.getOid()));
            vo.setCode(partDO.getPartNumber());
            vo.setCodeName(partDO.getName());

            UserDO creatorUserDO = typlmUserService.queryUserByKey(partDO.getCreatoroId());
            vo.setCreator(creatorUserDO.getFullname());
            vo.setCreateTime(partDO.getCreatestamp());
            vo.setModifyTime(partDO.getUpdatestamp());

            UserDO modifierUserDO = typlmUserService.queryUserByKey(partDO.getUpdatoroId());
            vo.setModifier(modifierUserDO.getFullname());
            vo.setDeactivationTime(partDO.getLastupdatestamp());
            if(StringUtils.isBlank(partDO.getPartNumber()) || StringUtils.isEmpty(partDO.getPartNumber())){
                continue;
            }
            if(partDO.getPartNumber().length() > 5){
                vo.setComponentCode(partDO.getPartNumber().substring(0,5));
            }else {
                continue;
            }
            vo.setActiveFlag(LifeCycleStateMap.get(partDO.getLifecyclestagekey()));

            if (partDO.getPartNumber().length() > 12){
                vo.setDrawingCode(partDO.getPartNumber().substring(0,13));
            }

            if (CollUtil.isNotEmpty(attributeVOS)) {
                for (AttributeVO attributeVO : attributeVOS) {
                    if ("description".equals(attributeVO.getAttributeEnName())) {
                        String codeDescription = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setCodeDescription(codeDescription);
                    } else if ("historyDescription".equals(attributeVO.getAttributeEnName())) {
                        String historyDescription = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setHistoryDescription(historyDescription);
                    }  else if ("2D/3D".equals(attributeVO.getAttributeEnName())) {
                        String dimensionType = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setDimensionType(dimensionType);
                    } else if ("FormDescription".equals(attributeVO.getAttributeEnName())) {
                        String formDescription = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setFormDescription(formDescription);
                    } else if ("SegmentNumber".equals(attributeVO.getAttributeEnName())) {
                        String sectionNumber = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setSectionNumber(sectionNumber);
                    } else if ("REMARK".equals(attributeVO.getAttributeEnName())) {
                        String remarks = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setRemarks(remarks);
                    } else if ("VariationType".equals(attributeVO.getAttributeEnName())) {
                        String changeType = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setChangeType(changeType);
                    } else if ("ChangePoint".equals(attributeVO.getAttributeEnName())) {
                        String changePoint = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setChangePoint(changePoint);
                    } else if ("Applicant".equals(attributeVO.getAttributeEnName())) {
                        String applicant = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setApplicant(applicant);
                    } else if ("NoticeChangeNumber".equals(attributeVO.getAttributeEnName())) {
                        String designChangeNoticeNo = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setDesignChangeNoticeNo(designChangeNoticeNo);
                    } else if ("ReasonUpgrade".equals(attributeVO.getAttributeEnName())) {
                        String revisionReason = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setRevisionReason(revisionReason);
                    } else if ("UpgradeRemarks".equals(attributeVO.getAttributeEnName())) {
                        String revisionNotes = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setRevisionNotes(revisionNotes);
                    } else if ("Proposer".equals(attributeVO.getAttributeEnName())) {
                        String descModifier = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setDescModifier(descModifier);
                    } else if ("RevisionOpinions".equals(attributeVO.getAttributeEnName())) {
                        String descModificationNotes = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setDescModificationNotes(descModificationNotes);
                    } else if ("UnitMeasurement".equals(attributeVO.getAttributeEnName())) {
                        String unitOfMeasure = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setUnitOfMeasure(unitOfMeasure);
                    } else if ("Products".equals(attributeVO.getAttributeEnName())) {
                        String productCategory = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setProductCategory(productCategory);
                    } else if ("DevelopmentOrder".equals(attributeVO.getAttributeEnName())) {
                        String developmentOrder = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setDevelopmentOrder(developmentOrder);
                    } else if ("MachineModel".equals(attributeVO.getAttributeEnName())) {
                        String machineModel = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setMachineModel(machineModel);
                    } else if ("PatternState".equals(attributeVO.getAttributeEnName())) {
                        String drawingStatus = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setDrawingStatus(drawingStatus);
                    } else if ("ReferencePrice".equals(attributeVO.getAttributeEnName())) {
                        BigDecimal referencePrice = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? new BigDecimal(attributeVO.getAttributeValue())
                                : new BigDecimal(attributeVO.getAttributeValuex());
                        vo.setReferencePrice(referencePrice);
                    }  else if ("SuperiorCoding".equals(attributeVO.getAttributeEnName())) {
                        String parentCode = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setParentCode(parentCode);
                    } else if ("manufacturingAttributes".equals(attributeVO.getAttributeEnName())) {
                        String manufacturingAttributes = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setManufacturingAttributes(manufacturingAttributes);
                    } else if ("PatternCode".equals(attributeVO.getAttributeEnName())) {
                        String drawingCode = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setDrawingCode(drawingCode);
                    }else if ("Combination".equals(attributeVO.getAttributeEnName())) {
                        String combination = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setCombination(combination);
                    }else if ("oldMaterialCode".equals(attributeVO.getAttributeEnName())) {
                        String oldMaterialCode = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setOldMaterialCode(oldMaterialCode);
                    }else if ("FinancialClassification".equals(attributeVO.getAttributeEnName())) {
                        String clasificacionContable = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setClasificacionContable(clasificacionContable);
                    }else if ("hazardousSubstance".equals(attributeVO.getAttributeEnName())) {
                        String hazardousSubstance = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setHazardousSubstance(hazardousSubstance);
                    }else if ("specification".equals(attributeVO.getAttributeEnName())) {
                        String specification = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setSpecification(specification);
                    }else if ("screwPitch".equals(attributeVO.getAttributeEnName())) {
                        String screwPitch = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setScrewPitch(screwPitch);
                    }else if ("Performance".equals(attributeVO.getAttributeEnName())) {
                        String performance = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setPerformance(performance);
                    }else if ("SurfaceTreatment".equals(attributeVO.getAttributeEnName())) {
                        String surfaceTreatment = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setSurfaceTreatment(surfaceTreatment);
                    }else if ("specialRequirement".equals(attributeVO.getAttributeEnName())) {
                        String specialRequirements = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setSpecialRequirements(specialRequirements);
                    }else if ("3DDrawingNumber".equals(attributeVO.getAttributeEnName())) {
                        String s = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setDrawingNumber3D(s);
                    }else if ("Description".equals(attributeVO.getAttributeEnName())) {
                        String s = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setDescription(s);
                    }else if ("outputRequirements".equals(attributeVO.getAttributeEnName())) {
                        String s = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setOutputRequirements(s);
                    }else if ("devCode".equals(attributeVO.getAttributeEnName())) {
                        String devCode = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setDevCode(devCode);
                    }else if ("productType".equals(attributeVO.getAttributeEnName())) {
                        String productType = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setProductType(productType);
//                    }else if ("Downtime".equals(attributeVO.getAttributeEnName())){
//                        String deactivationTime = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
//                                : attributeVO.getAttributeValuex();
//                        vo.setDeactivationTime(deactivationTime);
                    }else if ("ProductSeries".equals(attributeVO.getAttributeEnName())){
                        String productSeries = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setProductSeries(productSeries);
                    }else if ("MainPushStatus".equals(attributeVO.getAttributeEnName())){
                        String mainPushStatus = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setMainPushStatus(mainPushStatus);
                    }

                    else if ("HistoricalModels".equals(attributeVO.getAttributeEnName())){
                        String historicalModels = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setHistoricalModels(historicalModels);
                    }
                    else if ("ProductSpectrumName".equals(attributeVO.getAttributeEnName())){
                        String productSpectrumName = StringUtils.isBlank(attributeVO.getAttributeValuex()) ? attributeVO.getAttributeValue()
                                : attributeVO.getAttributeValuex();
                        vo.setProductSpectrumName(productSpectrumName);
                    }

                    if (vo.getProductSpectrumName()!=null && vo.getHistoricalModels()!=null){
                        vo.setSplicing(vo.getProductSpectrumName()+vo.getHistoricalModels());
                    }
                }
            }
            if (type.equals("PatternCode") || type.equals("MaterialCode")){
                vo.setImg(rtPartMapper.queryImgFileOid(vo.getOid()));
            }

            drawingCodePartVOS.add(vo);
        }

        return drawingCodePartVOS;
    }

    @Override
    public List<String> queryIbaName(String type) {
        BigInteger typeOid = rtTypeClassMapper.queryTypeOidByName(type);
        if(typeOid == null){
            return Collections.emptyList();
        }
        List<TyAttributeDefMapVO> tyAttributeDefMapVOS = typlmTypeService.queryInheritAttrDef(typeOid, TableTypeConstrant.TY_TYPE_OTYPE);
        if(CollUtil.isNotEmpty(tyAttributeDefMapVOS)){
            List<String> collect = tyAttributeDefMapVOS.stream().map(TyAttributeDefMapVO::getName).collect(
                    Collectors.toList());
            List<Map<String, String>> maps = rtTypeClassMapper.selectAllTypeIBAName("bzj", "标准件");
            collect.addAll(maps.stream().map(m->m.get("IBADEFINNERNAME")).collect(Collectors.toList()));
            return collect;
        }




        return Collections.emptyList();
    }
}
